package cn.com.anypay.manager.miaoma.student.dto;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.ToString;

import java.util.Map;
import java.util.HashMap;

/**
 * 学生统计信息DTO
 * 用于展示各种统计数据
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
public class StudentStatisticsDTO {

    /**
     * 学生总数
     */
    private Long totalStudents;

    /**
     * 活跃学生数（状态为正常）
     */
    private Long activeStudents;

    /**
     * 休学学生数
     */
    private Long suspendedStudents;

    /**
     * 退学学生数
     */
    private Long withdrawnStudents;

    /**
     * 性别分布统计
     * key: 性别代码 (0-未知, 1-男, 2-女)
     * value: 人数
     */
    @Builder.Default
    private Map<Integer, Long> genderDistribution = new HashMap<>();

    /**
     * 班级分布统计
     * key: 班级名称
     * value: 人数
     */
    @Builder.Default
    private Map<String, Long> classDistribution = new HashMap<>();

    /**
     * 年龄段分布统计
     * key: 年龄段描述
     * value: 人数
     */
    @Builder.Default
    private Map<String, Long> ageGroupDistribution = new HashMap<>();

    /**
     * 状态分布统计
     * key: 状态代码 (0-正常, 1-休学, 2-退学)
     * value: 人数
     */
    @Builder.Default
    private Map<Integer, Long> statusDistribution = new HashMap<>();

    /**
     * 本月新增学生数
     */
    private Long newStudentsThisMonth;

    /**
     * 本年新增学生数
     */
    private Long newStudentsThisYear;

    /**
     * 平均年龄
     */
    private Double averageAge;

    /**
     * 成年学生比例（百分比）
     */
    private Double adultPercentage;

    /**
     * 获取性别分布描述
     */
    public Map<String, Long> getGenderDistributionDesc() {
        Map<String, Long> result = new HashMap<>();
        genderDistribution.forEach((key, value) -> {
            String desc = switch (key) {
                case 1 -> "男";
                case 2 -> "女";
                default -> "未知";
            };
            result.put(desc, value);
        });
        return result;
    }

    /**
     * 获取状态分布描述
     */
    public Map<String, Long> getStatusDistributionDesc() {
        Map<String, Long> result = new HashMap<>();
        statusDistribution.forEach((key, value) -> {
            String desc = switch (key) {
                case 0 -> "正常";
                case 1 -> "休学";
                case 2 -> "退学";
                default -> "未知";
            };
            result.put(desc, value);
        });
        return result;
    }

    /**
     * 获取学生活跃率（百分比）
     */
    public Double getActiveRate() {
        if (totalStudents == null || totalStudents == 0) {
            return 0.0;
        }
        return (activeStudents != null ? activeStudents.doubleValue() : 0.0) / totalStudents * 100;
    }
}